import axios from 'axios'
import { Message } from 'element-ui'
import { getLoginInfo } from '@/utils/storage.js'
import { toSignInPage } from '@/utils/profile'

// 创建 axios 实例
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API, // 从环境变量读取 API 地址
  timeout: 600000, // 超时时间
  headers: { 'Content-Type': 'application/json;charset=UTF-8' }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 是否为登录、注册接口
    // 除了登陆注册接口、其余接口需要在 headers 添加 Authorization
    const urlSuffix = config.url.split('/').at(-1)
    if (['register', 'login'].includes(urlSuffix)) {
    } else {
      const info = getLoginInfo() || {}
      config.headers['Authorization'] = 'Bearer ' + info.accessToken
    }

    // 处理文件上传
    if (config.isUpload) {
      config.headers['Content-Type'] = 'multipart/form-data'
    }

    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response
    // 自定义状态码验证（根据后端约定）
    if (res.status !== 200 && res.status !== 201) {
      // 抛出错误信息
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res.data
    }
  },
  error => {
    // 处理 HTTP 网络错误
    let message = ''
    if (error && error.response) {
      switch (error.response.status) {
        case 400:
          message = '请求错误'
          break
        case 401:
          message = '未授权，请登录'
          break
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = `请求地址出错: ${error.response.config.url}`
          break
        case 500:
          message = '服务器内部错误'
          break
        default:
          message = '网络连接故障'
      }
    } else if (error.message.includes('timeout')) {
      message = '请求超时'
    } else {
      message = '网络连接异常'
    }

    // 暂定：403 为没有登录
    // 清空登录信息
    // 跳转到登录页
    if (message === '拒绝访问' || message === '未授权，请登录') {
      console.log(message, error);
      toSignInPage()
      return
    }
    message = error.response.data.message || message
    Message.error(message)
    return Promise.reject(error)
  }
)

// 核心请求方法
export function request(config) {
  return service(config)
}

// 简化版 GET/POST 方法
export function get(url, params, config = {}) {
  return request({ url, method: 'GET', params, ...config })
}

export function post(url, data, config = {}) {
  return request({ url, method: 'POST', data, ...config })
}

export function _delete(url, data, config = {}) {
  return request({ url, method: 'DELETE', data, ...config })
}

export function patch(url, data, config = {}) {
  return request({ url, method: 'PATCH', data, ...config })
}

// 文件上传专用方法
export function uploadFile(url, file, data, key = 'file') {
  const formData = new FormData()
  formData.append(key, file)
  if (typeof data === 'object' && data !== null) {
    Object.keys(data).forEach(k => formData.append(k, data[k]))
  }
  return post(url, formData, { isUpload: true })
}
